<?php

declare(strict_types=1);

namespace app\common\Image;

use app\common\AliyunOss\Image as AliyunOssImage;

class BaseImage
{

    protected $aliyun_oss;
    protected $image;
    protected $oss_domain_name;

    public function __construct()
    {
        $this->aliyun_oss = new AliyunOssImage();
        $this->oss_domain_name = config('filesystem.aliyun-oss.bucket') . '.' . config('filesystem.aliyun-oss.endpoint');
        $this->image = [
            'limit' => [
                'type_limit' => explode(',', config('filesystem.file.image.type_limit')),
                'max_size_limit' => config('filesystem.file.image.max_size_limit')
            ],
            'temp_path' => root_path() . 'public/static/uploads/temp/'
        ];
    }


    /**
     * @describe 生成唯一的文件名。
     * @author: Bobo
     * @date: 2024-06-11 03:39:08 
     * @param string $type 文件的后缀名，必须是字母或数字的组合。  @required
     * @return string |Exception  返回一个唯一且带有指定后缀的文件或者抛出异常。
     */
    public function createFileName(string $type): string
    {
        if (!preg_match('/^[a-z0-9]+$/', $type)) {
            throw new \Exception('非法文件后缀名');
        }
        return date('YmdHis') .  ceil(microtime(true) * 1000) .  bin2hex(random_bytes(5)) . '.' . $type;
    }

    /**
     * @describe
     * @author: Bobo
     * @date: 2024-06-11 23:00:51 
     * @param string $fileName  文件名称 @required
     * @param string $type 操作类型，默认为空，
     * @return string|Exception 构建的文件路径或异常
     */
    public function createOssFilePath(string $fileName, string $type = ''): string
    {
        if (!$fileName || preg_match('/[^\w\s\-\.]/', $fileName)) {
            throw new \Exception("非法文件文件名称");
        }
        $filePath = date('Ym') . '/' . date('d');
        switch ($type) {
            case 'thumb':
                $filePath .= '/thumb/thumb_' . $fileName;
                break;
            case 'water':
                $filePath .= '/water/water_' . $fileName;
                break;

            default:
                $filePath .= '/' . $fileName;
                break;
        }
        return $filePath;
    }
}
